/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package elipse;

import processing.core.PApplet;

/**
 *
 * @author DAVINCI
 */
public class Elipse extends PApplet {

    int xStart, x0, y0;
    int yStart;
    int xEnd;
    int yEnd;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        PApplet.main(new String[]{"elipse.Elipse"});
    }

    void PuntosElipse(int x, int y) {
        point(x + xStart, y + yStart);
        point(x + xStart, -y + yStart);
        point(-x + xStart, -y + yStart);
        point(-x + xStart, y + yStart);
    }

    void ElipsePuntoMedio(int a, int b) {//2a es la longitud del eje mayor en x y 2b es la del eje menor en y

        int x = 0;
        int y = b;
        double d1 = pow((float) b, 2) - (pow((float) a, 2) * b) + ((float) 0.25 * pow((float) a, 2));
        PuntosElipse(x, y);
        //REGION 1
        while ((double) (pow(a, 2) * (y - (float) 0.5)) > (double) (pow(b, 2) * (x + 1))) {//Test para saber que el gradiente esta en la region
            if (d1 < 0) { //Selecciona E
                d1 += pow(b, 2) * (2 * x + 3);
            } else {//Selecciona SE
                d1 += pow(b, 2) * (2 * x + 3) + pow(a, 2) * (-2 * y + 2);
                y--;
            }
            x++;
            PuntosElipse(x, y);
        }
        //REGION 2
        double d2 = pow(b, 2) * pow((float) (x + 0.5), 2) + pow(a, 2) * pow(y - 1, 2) - pow(a, 2) * pow(b, 2);
        while (y > 0) {
            if (d2 < 0) {//Select SE
                d2 += pow(b, 2) * (2 * x + 2) + pow(a, 2) * (-2 * y + 3);
                x++;
            } else {
                d2 += pow(a, 2) * (-2 * y + 3);
            }
            y--;
            PuntosElipse(x, y);
        }

    }

    @Override
    public void setup() {
        size(800, 600);
        background(200);

    }

    @Override
    public void draw() {
    }

    @Override
    public void mousePressed() {
        xStart = mouseX;
        yStart = mouseY;

    }

    @Override
    public void mouseDragged() {
        background(200);
        xEnd = mouseX;
        yEnd = mouseY;
        int a, b;
        int dx = xEnd - xStart;
        int dy = yEnd - yStart;
        a=abs(dx);
        b=abs(dy);

//        if (abs(dx) > abs(dy)) {
//            a = abs(dx);
//            b = abs(dy);
//        } else {
//            a = abs(dy);
//            b = abs(dx);
//        }
        ElipsePuntoMedio(a, b);
    }
}
